import time
from pathlib import Path
import logging

from entry.Constant import Parameter
from entry.DataGenerator import DataGenerator
from algorithm.PermFlexFlowShop import PermFlexFlowShop
from model.Model import SemiconductorSchedulerModel



# 定义日志文件路径
log_path = Path("ChipSchduile/logs/logs.txt")
# 确保日志目录存在（parents=True：自动创建多级目录；exist_ok=True：目录已存在时不报错）
log_path.parent.mkdir(parents=True, exist_ok=True)

# 配置日志系统
logging.basicConfig(
    level=logging.DEBUG,  # 全局日志级别：记录DEBUG及以上级别的日志
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 日志格式
    handlers=[
        logging.FileHandler(log_path),  # 输出到文件
        logging.StreamHandler()         # 同时输出到控制台（默认是sys.stderr）
    ]
)

# 获取指定名称的日志记录器
file_logger = logging.getLogger("file_logger")

'''初始化参数'''
Parameter.CORRECT_TIME_AL = 8.0   # 校准时间
Parameter.CYCLE_TIME_TM23 = 4.0   # 转移模块绕行一周时间
Parameter.MOVE_TIME_TM1 = 1.0     # TM1不同模块间移动时间

Parameter.PUT_TIME_TM1 = 4.0      # TM1放晶圆时间
Parameter.TAKE_TIME_TM1 = 4.0     # TM1取晶圆时间
Parameter.PUT_TIME_TM2 = 4.0      # TM2放晶圆时间
Parameter.TAKE_TIME_TM2 = 4.0     # TM2取晶圆时间
Parameter.PUT_TIME_TM3 = 4.0      # TM3放晶圆时间
Parameter.TAKE_TIME_TM3 = 4.0     # TM3取晶圆时间

Parameter.OPEN_CLOSE_TIME_VALVE = 1.0   # 阀门开关时间
Parameter.CLEAN_FREE_WAIT_TIME = 80.0   # 空闲触发清洁时间
Parameter.CLEAN_FREE_EXECUTION_TIME = 30.0    # 空闲清洁执行时间
Parameter.CLEAN_PROCESS_PATH_SWITCHING_TIME = 200.0         # 路径切换清洁执行时间
Parameter.CLEAN_ACCUMULATED_PROCESSED_ITEM_TIME = 300.0     # 加工限制清洁执行时间
Parameter.CLEAN_ACCUMULATED_PROCESSED_ITEM_NUM = 13.0       # 加工阈值


def main():
    """主函数：芯片调度系统入口"""
    file_logger.debug("程序启动")

    data_generator = DataGenerator()

    # 生成任务和工件
    task5b = data_generator.generate_task_5b()
    job_b = data_generator.generate_job_b()
    # 执行调度问题：可排序柔性流水车间
    perm_flex_flow_shop = PermFlexFlowShop()

    # MILP模型
    schedule_model = SemiconductorSchedulerModel()
    # 运行调度模型
    schedule_model.run()

    # 计时
    start_time = time.perf_counter()

    perm_flex_flow_shop.execute_scheduling()


    end_time = time.perf_counter()
    duration = end_time - start_time

    print(f"执行时间: {duration:.3f} 秒")
    file_logger.debug(f"程序执行时间: {duration:.3f} 秒")


if __name__ == "__main__":
    main()